home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / c_news / 09 / cnews009.nws next >
Text File  |  1988-07-16  |  56KB  |  1,199 lines

  1.  
  2. *------------------------------------------------------------------------*
  3. |                                                                        |
  4. |   C News - International C Newsletter, Compiler review, and            |
  5. |            Tutorial.                                                   |
  6. |                                                                        |
  7. *------------------------------------------------------------------------* 
  8.  Volume 1, Number 9                                          15 July 1988 
  9.  
  10.  
  11.  Editor        |       Editor's Corner: The Heap  .................... 1   
  12.  Barry Lynch   |         by Barry Lynch 
  13.                | 
  14.  Australian    | 
  15.  Office:       |       Resident C: a review  ......................... 2
  16.  David Nugent  |         by Bill Querry 
  17.                | 
  18.                |       Programming the Hercules Graphics Card  ....... 4 
  19.                |       Part II: by David Cheslow   
  20.                |   
  21.                |       Practical C: Everyday C Solutions............. 18
  22.                |          by Readers of C News  
  23.                |  
  24.                |       Latest PD/Commercial Software Release  ....... 19
  25.                | 
  26.                |       Article Submission Standards  ................ 20
  27.                | 
  28.                |       Address's    ................................. 21
  29.                | 
  30.                |       Index   ...................................... 22
  31.                | 
  32.                |       Distribution Points   ........................ 24
  33.                |  
  34.                |       User Response Form  .......................... 25
  35.                |
  36.                |       C News is an Electronic Journal published by the  
  37.                |       C BBS in Burke, VA Bi-Monthly.  All rights are 
  38.                |       reserved, and all opinions expressed are of the 
  39.                |       authors and any damage sustained, either physically 
  40.                |       or financially via use of the routines in this 
  41.                |       journal are at the sole expense of the reader. 
  42.                | 
  43.                | 
  44.      C News 1-09                 Page 1                   15 Jul 1988  
  45.   
  46.      ================================================================  
  47.      The Heap:  Messages from the editor    
  48.      ================================================================  
  49.   
  50.              Issue 9 represents a milestone of sorts for C News: Our
  51.      6th month anniversary.  This is truly remarkable considering what
  52.      C News started as, a couple of pages of notes by yours truly on
  53.      Christmas Day 1987.  C News has grown to proportions that I 
  54.      personally never thought it would, and with issue we continue to
  55.      add new features and announce a few future enhancements as well.
  56.  
  57.      PRACTICAL C: Everyday problems with C solutions
  58.  
  59.           This column was founded this past week at the first ever C BBS
  60.      user meeting.  One of the users had a small problem that required
  61.      him to write a small, yet powerful, C program.  This problem and the
  62.      program are included in this issue.
  63.  
  64.      C BBS New Phone Number:
  65.  
  66.           The C BBS has changed the type of phone service that we use here,
  67.      from Local to Metro DC area.  This means that users in the Metro DC
  68.      area can call the C BBS as a local call and vice versa.  This also
  69.      means that the C BBS is once again PC Pursuitable.  The new number
  70.      is (703) 644-6478.  I apologize for the inconvenience, and will get
  71.      the phone company to get a message on the old number as soon as
  72.      possible.
  73.  
  74.      Future Enhancements:
  75.  
  76.          In this issue of C News, David Cheslow continues his series on
  77.      programming the Hercules Graphics Adapter.  In future issues, art-
  78.      icles on the following subjects will be included:
  79.  
  80.           - Database Design and Implementation.
  81.           - cMail - a Fidonet compatible Mail Check.
  82.           - An article on a Comm program with src.
  83.  
  84.           As you can see with these future topics, C News will be providing
  85.       more code samples and theory.  If you are interested in assisting in
  86.       any of these areas, or in one that you are particularly interested
  87.       in.  Please send me a note at any of the address's listed later on
  88.       in this document.  
  89.       C News 1-09                Page 2                    15 Jul 1988
  90.  
  91.       ================================================================ 
  92.       /*resident_C*/ by Essential Software, Inc. 
  93.       ================================================================ 
  94.  
  95.            Everybody has their favorite TSR "pop-up" software that 
  96.       they use every day. Until now though, if one wanted to create 
  97.       their own TSR "pop-up" that did anything significant at all or 
  98.       wanted to create one that did something just like FAMOUS.EXE. 
  99.       An intimate knowledge of assembler and MS-DOS "tricks" was an
  100.       absolute necessity. Now with /*resident_C*/ from Essential
  101.       Software, Inc., almost anything you want to do (including DOS
  102.       calls!) can be done from C. 
  103.  
  104.           /*resident_C*/ is a C language library package that handles 
  105.       all the tricky MS_DOS documented and undocumented interfaces so 
  106.       that the C programmer can put full effort and concentration on 
  107.       the program function and know that the MS-DOS TSR details are 
  108.       already handled via a function call.  
  109.  
  110.            The authors (and so do I) suggest that you create and 
  111.       test and develop your program in a non-TSR environment first, and 
  112.       then add the function calls for residency after the program works 
  113.       properly. To make it a TSR will add three function calls: 
  114.  
  115.            1. Make sure the program isn't already "loaded". 
  116.            2. Install program as a TSR. 
  117.            3. Optionally "unload" your program when desired and 
  118.               safe. 
  119.  
  120.            The library installs your programs as a well behaved TSR  
  121.       (if there is such a thing) by chaining to the previous owner of  
  122.       any used interrupts (unlike the original SIDEKICK). By not  
  123.       hogging the interrupts, your TSR can be loaded concurrent with  
  124.       other "well behaved" TSR's. 
  125.  
  126.            The /*resident_C*/ library has two other similar load  
  127.       functions for creation of ISR's (interrupt service routines and 
  128.       what Essential Software calls a hybrid-TSR. ISR's are very  
  129.       useful for creation of "shared" software functions in larger  
  130.       projects. Shared functions can be made resident and then invoked  
  131.       via a software interrupt, saving memory for the common code. 
  132.  
  133.            The "hybrid-TSR" is an interesting feature. Instead of  
  134.       using the normal "hot-key" method of invoking a function, a chain  
  135.       to the system clock interrupt is made. Your TSR program checks  
  136.       for the "condition" for popping up to occur and either returns or  
  137.       pops up. A "hot-key" can also be assigned to this hybrid giving a  
  138.       large amount of flexibility in your program design. I have  
  139.       successfully used this "hybrid-TSR" scheme to check and control a 
  140.       hardware device that needed to be interfaced to a commercial EGA 
  141.       graphic intensive software package. 
  142.  
  143.       C News 1-09                Page 3                    15 Jul 1988
  144.  
  145.       ================================================================ 
  146.       /*resident_C*/ by Essential Software, Inc. Cont'
  147.       ================================================================ 
  148.  
  149.             Memory overhead for a /*resident_C*/ TSR/ISR is relatively
  150.       small (4-6k bytes depending on model used). 
  151.  
  152.             The /*resident_C*/ library package lists for $99.00 and  
  153.       is available with source for a list price of $198.00. The source  
  154.       code is well commented and is a good method to learn the tricks  
  155.       of MS-DOS TSR interfacing. The library comes with a 43 page  
  156.       manual of which almost 20 pages of it is a tutorial on TSR/ISR  
  157.       development and how /*resident_C*/ does its thing. The software  
  158.       comes one disk with language support for Microsoft C5.x, 
  159.       Turbo C, and Lattice C. Nice for us that develop in different 
  160.       compilers for different projects. Also included are demo programs 
  161.       showing how to use the library in all three of the supplied 
  162.       interfaces. I have included one of their demos in both source and  
  163.       executable format so that you can see how easy it is to make a  
  164.       TSR.  
  165.  
  166.            If you purchase the library source and want to make 
  167.       changes, a Microsoft MASM 5.x compatible assembler will be needed 
  168.       for re-compiling.  As with all of Essential's library packages, no
  169.       royalties are required for software incorporating /*resident_C*/
  170.       functions into your programs. 
  171.  
  172.             I have on occasion used their technical support, and  
  173.       have found willing, helpful and knowledgeable people (including  
  174.       the authors of the packages).  I have used this package along with
  175.       other libraries, mostly Essential's Utilities, Essential's Graphics,
  176.       and Essential's Communications (I DO like these Essential Software 
  177.       products!) and have had no problems using any of their functions 
  178.       MS-DOS or otherwise. 
  179.  
  180.       DISCLAIMER: I have no connection or interest with Essential  
  181.       Software, Inc. other than a loyal user of their products for the  
  182.       last 2 years. 
  183.  
  184.       /*resident_C*/ list $99.00 ($198.00 with source) 
  185.       Essential Software, Inc. 
  186.       76 South Orange Avenue 
  187.       South Orange, New Jersey  07079 
  188.       201-762-6965 
  189.  
  190.       Reviewer: 
  191.       Bill Querry, VP Engineering 
  192.       Paragon Technologies, Inc. 
  193.       8383 Mentor Ave 
  194.       Mentor, Ohio  44060 
  195.       216-255-8343 
  196.  
  197.       C News 1-09                Page 4                    15 Jul 1988
  198.  
  199.       ================================================================ 
  200.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  201.       ================================================================ 
  202.  
  203.       Editor's Note:  This is the second in a series of Articles on
  204.                       programming for the Hercules Graphics Adapter.
  205.                       The 1st article in this series was included in
  206.                       C News Issue 8.  All comments regarding this
  207.                       series should be directed to the author:
  208.                       David Cheslow.
  209.  
  210.       Part II: Programming for the Hercules Graphics Adapter.
  211.  
  212.       SHIFT & LOGICAL OPERATORS 
  213.  
  214.       Shifts are very fast binary operators, they work like this: 
  215.  
  216.           11111111 >> 1 = 01111111 
  217.           11111111 << 1 = 11111110 
  218.  
  219.       Logical operators are also faster than the equivalent 
  220.       mathematical operators, they work,like this: 
  221.  
  222.           10101010 & 00001111 = 00001010 
  223.           10101010 | 00001111 = 10101111 
  224.           10101010 ^ 00001111 = 10100101 
  225.                    ~ 00001111 = 11110000 
  226.  
  227.       Many of the H_GRAPH functions use the shift and logical 
  228.       operators to improve execution speed.  Some optimizing 
  229.       compilers may automatically substitute shift and logical 
  230.       operators for the more time consuming multiplication, 
  231.       division and modulus operators.  Using the more efficient 
  232.       (binary) operators in our code ensures that they will be 
  233.       used and forces us to think of things the same way the 
  234.       computer does. The bottom line is this: 
  235.  
  236.          x>>1 is equivalent to x/2; 
  237.          x>>2 is equivalent to x/4; 
  238.          x>>3 is equivalent to x/8; etc. 
  239.  
  240.          x<<1 is equivalent to x*2; 
  241.          x<<2 is equivalent to x*4; 
  242.          x<<3 is equivalent to x*8; etc. 
  243.  
  244.          x&1 is equivalent to x%2; 
  245.          x&3 is equivalent to x%4; 
  246.          x&7 is equivalent to x%8; etc. 
  247.  
  248.       Where x is a two byte integer. 
  249.  
  250.  
  251.       C News 1-09                Page 5                    15 Jul 1988
  252.  
  253.       ================================================================ 
  254.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  255.       ================================================================ 
  256.  
  257.       Note that the result of 32768<<1 is 0 whereas the result of 
  258.       32768*2 will depend upon your compiler (i.e. numbers too small 
  259.       or large to fit in a two byte integer are always 0 when shift 
  260.       operators are used but will be unpredictable and incorrect 
  261.       when higher level operators are used).  Some compilers will 
  262.       produce an overflow error when high level operators are used 
  263.       to produce a result out of the range of a two byte integer 
  264.       (most just give an incorrect answer). 
  265.  
  266.       I have never heard of a compiler that does not support shift 
  267.       and logical operators, but if yours does not you may make the 
  268.       above substitutions. 
  269.  
  270.       If shift and logical operators are new to you, I suggest that 
  271.       you find a good book on binary arithmetic.  One that I found 
  272.       helpful was 'COMPUTE'S MACHINE LANGUAGE FOR THE IBM PC' 
  273.       published by COMPUTE magazine.  Your time and effort will be 
  274.       well spent learning about binary arithmetic.  Such knowledge 
  275.       will improve your understanding of your computer and will 
  276.       allow you to write much more efficient code. 
  277.  
  278.       HERCULES/CGA COMPATIBILITY 
  279.  
  280.       Most Hercules compatible graphics adapters (but not all) have 
  281.       the capability of operating in three distinct modes: DIAG, 
  282.       HALF and FULL.  DIAG mode is used for 100% IBM monochrome 
  283.       compatibility and masks all of the Hercules graphics 
  284.       capabilities.  HALF mode allows the Hercules to coexist with 
  285.       a CGA card, but disables the second graphics page. FULL mode 
  286.       enables all of the graphics features of the card but 
  287.       disallows the presence of any other graphics adapter in the 
  288.       computer. All of the H_GRAPH functions are written based on the 
  289.       assumption that the Hercules is the only graphics card 
  290.       installed in the computer and is, therefore, in FULL mode. 
  291.       For those people who would like to experiment with using the 
  292.       H_GRAPH functions on a dual monitor system or whose computer 
  293.       does not default to FULL mode, here is a function to 
  294.       change the Hercules's operating mode (don't confuse this with 
  295.       the graphics/text mode operations of the card).  The 
  296.       prototype is - void h_opmode(int newmode).  Note -  If you 
  297.       are using the H_GRAPH functions on a dual monitor system 
  298.       you should use HALF mode - and not use the second graphics 
  299.       page. 
  300.  
  301.  
  302.  
  303.  
  304.  
  305.       C News 1-09                Page 6                    15 Jul 1988
  306.  
  307.       ================================================================ 
  308.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  309.       ================================================================ 
  310.  
  311.       #define H_OPPORT 0x3BF 
  312.       #define H_DIAG   0 
  313.       #define H_HALF   1 
  314.       #define H_FULL   3 
  315.       #include <conio.h> 
  316.  
  317.       h_opmode(newmode) 
  318.       int newmode; 
  319.       { 
  320.        outp(H_OPPORT,((newmode==H_HALF)?1:((newmode==H_FULL)?3:0))); 
  321.       } 
  322.  
  323.       Where 'newmode' may have the values H_HALF or H_FULL, any 
  324.       other value will result in the DIAG mode (the safest of all 
  325.       the modes) being selected.  The FULL mode must never be 
  326.       selected when another graphics card is present in the computer! 
  327.       If you intend to use this function, always call it BEFORE 
  328.       calling the h_init function. 
  329.  
  330.       If you are using an EGA card along with the Hercules card, 
  331.       it's O.K. because the h_init function will always request a 
  332.       mode change to CGA emulation before initializing the Hercules 
  333.       graphics mode.  DO NOT use the video mode change function 
  334.       supported by your compiler to change to an EGA graphics mode 
  335.       while the Hercules is in graphics mode. The two are definitely 
  336.       incompatible and the result of requesting an EGA graphics mode 
  337.       while in Hercules graphics mode may be disastrous.  If the 
  338.       Hercules is in graphics mode, then the EGA must be in CGA 
  339.       emulation mode (as set by the h_init function).  If the 
  340.       Hercules is in text mode, then the EGA may be in any mode. 
  341.       If you use the HALF mode of operation in your programs, it is 
  342.       YOUR responsibly to make sure that you do not attempt 
  343.       to make the second graphics page of the Hercules card visible. 
  344.       Writing to the second graphics page is permissible but will 
  345.       really mess up the image on the other monitor. 
  346.  
  347.  
  348.       SCREEN BLANKING 
  349.  
  350.       Last month, I included a function to disable the Hercules card 
  351.       (blank the screen).  The routine will work correctly ONLY if 
  352.       the h_init function of the H_GRAPH functions is used.  Use of 
  353.       any other function to initialize the Hercules (maybe one that 
  354.       came with your compiler) will definitely destroy your monitor. 
  355.       This is a result of the fact that other programs/functions do 
  356.       not have any way to find out which graphics/text mode the 
  357.       adapter is currently in. 
  358.  
  359.       C News 1-09                Page 7                    15 Jul 1988
  360.  
  361.       ================================================================ 
  362.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  363.       ================================================================ 
  364.  
  365.       You have two options at this point: 
  366.  
  367.            1) do not mix H_GRAPH functions with other graphics library 
  368.               functions or
  369.  
  370.            2) do not use the screen blanking function. 
  371.  
  372.           In the September 1988 article I will cover a method of soft-
  373.       ware screen blanking which will be just as effective and will work 
  374.       with functions from other sources.  Also, any other set of 
  375.       functions which you might find will undoubtable have certain 
  376.       variables which are used to store the current graphics mode, 
  377.       operation mode, cursor position, etc.  Failure to set those 
  378.       variables will almost certainly cause you trouble.  Unless 
  379.       you get a lot of documentation with the functions from another 
  380.       source (the code is really what you need), it is probably 
  381.       best to stick with functions from one source. If you find a 
  382.       function from another source that you would like to use, 
  383.       I will be happy to try to write an H_GRAPH compatible function 
  384.       to perform the same task; just leave me a note in the C NEWS 
  385.       message section of the Mclean VA (USA) C BBS.  To all those 
  386.       who have already sent me messages - THANK YOU - your input is 
  387.       greatly appreciated. 
  388.  
  389.       CLIPPING 
  390.  
  391.           All of the H_GRAPH functions that draw on the screen will 
  392.       perform clipping at the edges of the current window as defined 
  393.       by the external variables h_xmin, h_ymin, h_xmax, and h_ymax. 
  394.       This will allow us to develop a full blown windowing package 
  395.       over time.  While I have not yet presented any window control 
  396.       functions but you are invited to experiment with the external 
  397.       variables.  If you have any suggestions, just drop me a line. 
  398.  
  399.       TEXT IN GRAPHICS MODE 
  400.  
  401.          Text is one of the most important parts of any graphic image 
  402.       you might conjure up.  A bar or pie chart without labels, 
  403.       while pretty, is not terribly informative.  Even a video game 
  404.       must display the current score and other information in 
  405.       textual form.  Two types of text images are called raster and 
  406.       vector fonts.  Raster fonts are exact images of the text to be 
  407.       drawn on the screen.  Raster fonts are quick to display and 
  408.       relatively easy to implement, but are not very versatile.  They 
  409.       can not easily be rotated or scaled.  Vector fonts, on the 
  410.       other hand, are not stored as exact screen images but as a set 
  411.       of points connected in order by lines. 
  412.  
  413.       C News 1-09                Page 8                    15 Jul 1988
  414.  
  415.       ================================================================ 
  416.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  417.       ================================================================ 
  418.  
  419.            Vector fonts can easily be rotated and scaled, but are much
  420.       harder to design and implement.  Vector fonts are typically dis-
  421.       played more slowly than their raster counterparts because the
  422.       position of each screen pixel making up the font must be calculated. 
  423.  
  424.            This month, I will present a raster font system made up of
  425.       two functions.  First is a function to load a font from a disk 
  426.       file into near memory.  Near memory is used to increase speed. 
  427.       The function returns a pointer to the raster image data which 
  428.       is then passed to the character drawing function.  All of the 
  429.       fonts are stored in the same amount of memory space (3,590 
  430.       bytes = 256 characters x 14 bytes per character + a 6 byte 
  431.       header describing the font).  The header information is: 
  432.  
  433.           1 byte cursor movement horizontally 
  434.           1 byte cursor movement vertically 
  435.           1 byte height of character 
  436.           1 byte width of character 
  437.           2 bytes start and stop position for 9th bit quoting 
  438.          --- 
  439.           6 bytes 
  440.  
  441.            The first two bytes determine the offset from the current 
  442.       cursor position to the beginning of the next character. 
  443.       They are interpreted as signed values, allowing negative 
  444.       offsets both horizontally and vertically.  For the standard 
  445.       font they are +9 and +0 respectively, indicating that each 
  446.       character is 9 pixels wide and printed horizontally.  Other 
  447.       fonts can have different values.  For example, the sideways 
  448.       font has values of 0 and -10 indicating that the font is 
  449.       10 pixels tall and printed vertically from bottom to top. 
  450.       Note that the starting position for displaying fonts is always 
  451.       the upper left corner of the first character.  The sideways 
  452.       font appears to be rotated but the starting point has not 
  453.       been rotated with the font. 
  454.  
  455.            The next two bytes contain the actual height and width of the 
  456.       raster image.  The width may only have the values 8 or 9.  The 
  457.       height may range from 1 to 14 inclusive (although heights less 
  458.       than about 5 are pretty useless).  A width of 8 allows 90 
  459.       characters to be displayed horizontally on the screen and a 
  460.       width of 9 allows 80 characters.  This feature, when combined 
  461.       with 9th bit quoting (next 2 bytes) can be used to produce 
  462.       primitive animation effects.  Note that 14 bytes of memory are 
  463.       set aside for the raster image even if the font is less than 
  464.       14 pixels tall. 
  465.  
  466.  
  467.       C News 1-09                Page 9                    15 Jul 1988
  468.  
  469.       ================================================================ 
  470.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  471.       ================================================================ 
  472.  
  473.             This was done to standardize the font files, font loading
  474.       function and the character drawing function.  I admit that in some
  475.       cases it wastes valuable near memory but I feel that the trade-off
  476.       is worth while. 
  477.  
  478.             Most characters are followed by a small blank space called
  479.       the inter-character spacing.  In the standard font this inter- 
  480.       character spacing includes the 9th bit.  Some of the box 
  481.       graphic characters in the standard font, however, require that 
  482.       the 9th bit be used to make the characters join on the screen 
  483.       (no inter-character spacing).  The 9th bit quoting feature 
  484.       allows for the situation in which some of the characters in a 
  485.       font must contain a 9th bit.  For those characters the 9th bit 
  486.       in each row of pixels is the same as the 8th bit.  Thus the 
  487.       9th bit quotes the 8th bit.  If the last 2 bytes of the font 
  488.       header are 179 and 224, then the characters whose ascii values 
  489.       are greater than 179 and less than 224 will have 9th bits 
  490.       which quote the 8th bit, all other characters will have blank 
  491.       9th bits (inter-character spacing).  Naturally, 9th bit 
  492.       quoting is only useful if the font is 9 bits wide. 
  493.  
  494.            I have included a primitive string drawing function in this 
  495.       months' release.  It simply displays a string of characters 
  496.       starting in the current graphics cursor position.  No attempt 
  497.       is made to accommodate line feeds, tabs or other white space 
  498.       characters (i.e. all characters are printable).  While this 
  499.       is somewhat inelegant, it serves our purposes nicely for 
  500.       the moment.  Next month I will present a couple of more 
  501.       powerful string drawing functions. 
  502.  
  503.             Three 'put modes' are supported by the character drawing 
  504.       function.  Those of you with a background in BASIC may recognize
  505.       put modes.  For those who don't know about such things, here is
  506.       a brief description of the three supported put modes: 
  507.  
  508.           PSET - this mode completely overwrites any background image. 
  509.  
  510.           XOR - this mode (exclusive or) is used whenever the 
  511.                 background image needs to be completely restorable
  512.                 and the program can not regenerate the image effi-
  513.                 ciently.
  514.  
  515.       It is most often used in animation (video games).  The trans-
  516.       lation to English would be something like "one image or the other
  517.       image, but never both images".  If that doesn't make any sense, just 
  518.       remember that XORing the same text in the same place twice will
  519.       restore the original image behind the text as if the text had never
  520.       been there. 
  521.       C News 1-09                Page 10                   15 Jul 1988
  522.  
  523.       ================================================================ 
  524.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  525.       ================================================================ 
  526.  
  527.  
  528.             OR - this mode displays the text overtop of the existing 
  529.       image creating a combination of the two.  It is most useful for 
  530.       labeling graphs. 
  531.  
  532.  
  533.           Also this month I am presenting a box fill function that is 
  534.       quite powerful.  It supports one additional put mode - AND. 
  535.  
  536.       AND - only those pixels which are part of both images are 
  537.       displayed.  This mode is useless in the text drawing function 
  538.       but when text is drawn and then a filled box is overlayed 
  539.       in the AND mode various grey scale text images can be achieved. 
  540.  
  541.            The box fill function also uses TILES.  A TILE is simply an 
  542.       eight byte character array.  Think of the TILES as stationary. 
  543.       They all start at position 0,0 and repeat until the end of the 
  544.       the screen is reached.  You can think of the box fill function 
  545.       as simply exposing the pre-existing tiles.  The advantage of using
  546.       TILES over a moveable fill image is that very few calculations are
  547.       needed to determine which byte is going to be exposed - yielding an
  548.       increase in speed. 
  549.  
  550.           The remaining functions presented this time are pretty straight 
  551.       forward.  To conserve space, the functions are not reprinted here in
  552.       the text as they were last month.  Instead, I have included a file
  553.       called H_GRAPH2.NUM.  It is simply a copy of the H_GRAPH functions
  554.       with line numbers in the right margin.  To follow the discussion of
  555.       the functions you will need to print out a copy of the H_GRAPH2.NUM
  556.       file. 
  557.  
  558.       THE FUNCTIONS 
  559.  
  560.            The m_init and m_cursor functions (lines 70 - 230) were discussed
  561.       in C NEWS #8. 
  562.  
  563.             The m_status function (lines 250 - 340) is not included in this
  564.       months demo program but it is the primary way to get information from
  565.       the mouse.  It returns an integer indicating which buttons are pressed
  566.       (0 = no buttons, 1 = left button, 2 = right button, 3 = middle button
  567.       on a 3 button mouse or both buttons together on a 2 button mouse). Two
  568.       other values are returned via pointer.  They are the current horizontal
  569.       and vertical pixel positions of the mouse cursor, respectively.  Note
  570.       that the addresses of 2 integer variables are passed (i.e. the function
  571.       call will look something like x=m_status(&y,&z).  In a mouse driven 
  572.       program, this becomes the primary function call for input. For that
  573.       reason it is a good candidate for assembly language. Maybe next time. 
  574.  
  575.       C News 1-09                Page 11                   15 Jul 1988
  576.  
  577.       ================================================================ 
  578.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  579.       ================================================================ 
  580.  
  581.  
  582.           The m_move function (lines 360 - 440) forces the mouse cursor 
  583.       to the pixel position specified by the two passed variables. Of
  584.       course the mouse itself does not move, only the cursor. 
  585.  
  586.           The m_limit function (lines 460 - 580) sets the minimum and 
  587.       maximum values for the horizontal and vertical movement of the 
  588.       mouse.  When the m_init function is called, these values are 
  589.       set to 0,0 - 639,199.  That's fine if you are working with 
  590.       a CGA adapter, but we're not. To get the mouse to move freely 
  591.       across the entire screen, we must call the m_limit function with 
  592.       the values 0,0,719,347.  This function can also be used to 
  593.       confine the mouse cursor any a smaller area of the screen.  You 
  594.       must turn the mouse cursor off whenever you change the image 
  595.       on the screen (add text, draw a box, anything ...).  In a video 
  596.       game these added function calls will greatly slow execution. 
  597.       To overcome this problem, simply limit the mouse cursor to the 
  598.       "playing area" , separate from the "scoring area" which is 
  599.       being continually updated. 
  600.  
  601.             The m_shape function (lines 600 - 710) allows you to create 
  602.       your own mouse cursors (within reason).  You will have to be able
  603.       to convert a near pointer to a far pointer and then split the far
  604.       pointer into its segment and offset portions. Some compilers simply
  605.       use long integers as far pointers.  If your compiler does not have
  606.       built in functions for splitting apart far pointers, try setting a
  607.       long integer equal to the far pointer.  Then create 2 short integers
  608.       from the long integer. Long >> 16 may equal the segment and Long &
  609.       65536 may equal the offset.  It's worth a try if you don't have the
  610.       functions already.  The mouse.h file contains instructions for creating 
  611.       your own cursors as well as five predrawn ones. 
  612.  
  613.              The functions h_isherc, h_init, h_setvpage and h_onoff (lines 
  614.       740 - 1510) were covered in C NEWS #8. 
  615.  
  616.            The h_drawc function (lines 1530 - 3030) (no that's not a 
  617.       misprint) takes two parameters, the character to print and a pointer
  618.       to a 3590 byte near memory character array containing a raster font
  619.       (loaded with the h_loadfont function).  I decided to pass this para-
  620.       meter so that you may have multiple fonts loaded at the same time.
  621.       Lines 1570 - 1650 define the external variables affected by this func-
  622.       tion.  Line 1660 defines the variables used to store the font header
  623.       information.  Line 1670 contains the definitions for a bunch of stuff;
  624.       i is a counter, offset is the number of pixels from the start of the
  625.       memory byte to    the starting position of the character, byte_loc is
  626.       the location of the    memory byte currently being changed, x1 and y1
  627.       are temporary storage for    the graphics cursor position, start and
  628.       stop_loc are the actual first and
  629.       C News 1-09                Page 12                   15 Jul 1988
  630.  
  631.       ================================================================ 
  632.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  633.       ================================================================ 
  634.  
  635.       last bit positions to be changed (after accounting for clipping),
  636.       edge_locis used in the calculation of clipped boundaries.  Line
  637.       1680 defines still more stuff - andmask1 and andmask2 are used when
  638.       changing memory bytes.  When a bit is set to 1 in the and mask, the
  639.       corresponding bit in the memory bytes will remain unchanged.  If a
  640.       bit is set to 0then the corresponding bit in the memory byte will
  641.       be replaced beth raster font data.  Andmask1 is for the left edge
  642.       of the character,andmask2 for the right.  This_byte is the byte from
  643.       the font array currently being displayed. Last_bit is used during 9th
  644.       bit quoting. 
  645.  
  646.       Lines 1690 - 1760 extract the necessary data from the font header. 
  647.       If the 8th bit of the delta_x or delta_y variables is set then 
  648.       the change in cursor position is interpreted as negative.  Some 
  649.       compilers support signed character variables, others do not.  This 
  650.       method will work in either case. 
  651.  
  652.       Line 1770 determines whether or not the entire character is outside
  653.       of the current window boundaries.  If it is, then there is no need
  654.       to continue.  The current cursor location is updated and the function
  655.       returns. 
  656.  
  657.       Lines 1830 - 2200 perform the left and right side clipping calculations.
  658.       I'm not going to go into any detail about this section.  Suffice it to
  659.       say that the edges of the character are calculated and compared to the
  660.       edges of the current window.  The greater of the two left edges and the
  661.       lessor of the two right edges is used to create the and masks. 
  662.  
  663.       The next three sections (lines 2250 - 2490, 2510 - 2740, and 2760 - 2990)
  664.       of the function are quite redundant, so I will describe just one of them
  665.       and then explain the differences between the three parts.  They are redund-
  666.       antly coded in this way to maximize speed (at the expense of code space).
  667.       For each row of pixels making up the font (line 2260), we first extract
  668.       the matching byte from the font array (line 2280). Since in most cases 9th
  669.       bit quoting is not used, we set the 9th bit to 0 (line 2290).  Then we
  670.       store the current pixel row in y1 (line 2300).  The next line performs
  671.       the vertical clipping (which is much easier than horizontal clipping).
  672.  
  673.       If the current byte is inside the current working window (line 2310),
  674.       then the exact byte in memory to be changed is found (line 2330).  The
  675.       byte is actually changed with the strange looking code on line 2340.
  676.       The memory byte h_p+byte_loc is banded with andmask1 to produce the por-
  677.       tion of the memory byte which will not be changed.  The result is ored
  678.       with the byte from the font array (after it is shifted into the proper
  679.       position). 
  680.  
  681.  
  682.  
  683.       C News 1-09                Page 13                   15 Jul 1988
  684.  
  685.       ================================================================ 
  686.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  687.       ================================================================ 
  688.  
  689.           Since all of the raster fonts are either 8 or 9 bits wide we 
  690.       assume that the character will span a byte boundary and affect 
  691.       the following memory byte as well.  The second memory byte 
  692.       is changed in lines 2350 - 2460 which also contains the 9th 
  693.       bit quoting calculations (lines 2370 - 2400). 
  694.  
  695.          The only difference between this part of the function and the 
  696.       other two lines in the memory changing lines (the lines that 
  697.       start with *(h_p+ ... ).  There are three such lines in each 
  698.       section.  It would be more efficient to code these sections 
  699.       using the logical equate operators (|= and ^=) but the Mix 
  700.       Power C optimizer freaks out when you do this so I have left 
  701.       those changes for you to check out on your own compiler. 
  702.       Similarly, since the Mix Power C compiler does a pretty good 
  703.       job at optimizing registers, I have made no effort to identify 
  704.       the best choices for register variables. 
  705.  
  706.       Finally, in line 3010 and 3020, the current graphics cursor 
  707.       position is updated appropriately. 
  708.  
  709.       The h_loadfont function takes two character array pointers 
  710.       as parameters.  The first points to a path\file name for the 
  711.       font and the second points to a 3590 byte character array 
  712.       which will hold the font data.  The function is set up this 
  713.       way to avoid dynamic memory allocation (an area in which many 
  714.       compilers differ).  The function is pretty straight forward. 
  715.       It simply reads 3590 bytes from the specified file and stores 
  716.       them in the designated array.  If the file is not found, then 
  717.       the function returns -1.  If all goes well it returns 0. 
  718.  
  719.       The h_boxfill function is the other biggie this month.  It takes 
  720.       three parameters.  The first two identify the bottom right 
  721.       corner of the boxed area.  Note that the current cursor 
  722.       position is ALWAYS interpreted as the upper left corner!  The 
  723.       third parameter is a pointer to one of many tile patterns 
  724.       (you are free to create more if you like).  Most of the 
  725.       variables have equivalent counterparts in the h_drawc function. 
  726.       These are new; Whole_bytes is the number of complete bytes 
  727.       between the left and right edges (normally, whole bytes will 
  728.       be equal to total bytes effected - 2 but if the box starts 
  729.       or ends on a byte boundary, the value may differ); save_byte 
  730.       is the current byte in use from the tile array; temp_byte is 
  731.       used to overcome the register allocation problem with the 
  732.       Mix optimizer.  Line 3270 returns from requests for boxes 
  733.       entirely out of the current window.  Lines 3280 - 3340 perform 
  734.       clipping, create the and masks and calculates the exact number 
  735.       of whole bytes. 
  736.  
  737.       C News 1-09                Page 14                   15 Jul 1988
  738.  
  739.       ================================================================ 
  740.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  741.       ================================================================ 
  742.  
  743.              The next section should look vaguely familiar to you.  It 
  744.       very closely follows the logic in the h_drawc function. The bigg-
  745.       est difference is in the way the ~ operator is used to effectively
  746.       mask out unwanted portions of the tile pattern.  Remember, we
  747.       shifted the font data.  Since the titles are stationary it is not
  748.       necessary to calculate the correct amount to shift, etc. 
  749.  
  750.              Also note the 4 assembly function calls (one for PSET, OR, 
  751.       AND and XOR).  One of these was presented last time but I will
  752.       repeat it in case you didn't key it in last month.  It is well
  753.       worth taking the time to make these ASM functions.  I calculate
  754.       about a 600% speed increase for PSET and about 125% for the other
  755.       functions.  It's not often that you find ten lines of code that
  756.       create speed improvements like that! 
  757.  
  758.       Here they are: 
  759.  
  760.       In each case, [bp+12] is the number of bytes to fill, [bp+10] is 
  761.       the byte from the tile, and [bp+8] and [bp+6] are the segment 
  762.       and offset portions of a far pointer respectively. 
  763.   
  764.        h_mempse push   bp 
  765.                 mov    bp,sp 
  766.                 mov    di,[bp+6] 
  767.                 mov    es,[bp+8] 
  768.                 mov    ax,[bp+10] 
  769.                 mov    cx,[bp+12] 
  770.                 jcxz      
  771.                 cld 
  772.                 rep stosb 
  773.        QUIT:    retfar 
  774.  
  775.        h_memor  push   bp 
  776.                 mov    bp,sp 
  777.                 mov    cx,[bp+6] 
  778.                 mov    ax,[bp+8] 
  779.                 mov    es,[bp+10] 
  780.                 mov    bx,[bp+12] 
  781.         DOIT:    es: 
  782.                  or     byte ptr [bx],al 
  783.                 ds: 
  784.                 inc    bx 
  785.                 loop   DOIT 
  786.                 pop    bp 
  787.                 retfar 
  788.  
  789.               h_memxor push   bp 
  790.                        mov    bp,sp 
  791.       C News 1-09                Page 15                   15 Jul 1988
  792.  
  793.       ================================================================ 
  794.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  795.       ================================================================ 
  796.  
  797.                      mov    cx,[bp+6] 
  798.                      mov    ax,[bp+8] 
  799.                      mov    es,[bp+10] 
  800.                      mov    bx,[bp+12] 
  801.             DOIT:    es: 
  802.                      xor    byte ptr [bx],al 
  803.                      ds: 
  804.                      inc    bx 
  805.                      loop   DOIT 
  806.                      pop    bp 
  807.                      retfar 
  808.  
  809.             h_memand push   bp 
  810.                      mov    bp,sp 
  811.                      mov    cx,[bp+6] 
  812.                      mov    ax,[bp+8] 
  813.                      mov    es,[bp+10] 
  814.                      mov    bx,[bp+12] 
  815.             DOIT:    es: 
  816.               and    byte ptr [bx],al 
  817.                      ds: 
  818.                      inc    bx 
  819.                     loop   DOIT 
  820.                      pop    bp 
  821.                   retfar 
  822.  
  823.            If you REALLY hate assembly language you can substitute the 
  824.       following: 
  825.  
  826.       Replace the h_mempse function call with: 
  827.  
  828.       for(i=0;i<whole_bytes;i++) 
  829.       { 
  830.            *(h_p+ ++byte_loc)=save_byte; 
  831.       } 
  832.       Replace the h_memor function call with: 
  833.  
  834.       for(i=0;i<whole_bytes;i++) 
  835.       { 
  836.            *(h_p+ ++byte_loc)|=save_byte; 
  837.       } 
  838.       Replace the h_memxor function call with: 
  839.  
  840.       for(i=0;i<whole_bytes;i++) 
  841.       { 
  842.            *(h_p+ ++byte_loc)^=save_byte; 
  843.       } 
  844.  
  845.       C News 1-09                Page 16                   15 Jul 1988
  846.  
  847.       ================================================================ 
  848.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  849.       ================================================================ 
  850.  
  851.       Replace the h_memand function call with: 
  852.  
  853.       for(i=0;i<whole_bytes;i++) 
  854.       { 
  855.             *(h_p+ ++byte_loc)&=save_byte; 
  856.       } 
  857.  
  858.  
  859.       The h_moveto function simply provides a consistent way of 
  860.       changing the current graphics cursor location to the position 
  861.       specified by the two parameters. 
  862.  
  863.       The h_box function takes the same parameters as the h_boxfill 
  864.       function but does not fill the box.  Using different tiles 
  865.       produces various dashed and dotted lines. 
  866.  
  867.       The h_setpmode function provides a consistent method of changing 
  868.       the current put mode. 
  869.  
  870.       The h_clrw function clears the current window by trying to 
  871.       fill the entire screen (the boxfill function does the clipping). 
  872.       The only parameter is a tile pointer.  The graphics cursor 
  873.       position is not changed and the pre-existing put mode is 
  874.       restored. 
  875.  
  876.       The h_explode function is used in the demo to give you an 
  877.       idea of the many possibilities designed into the h_boxfill 
  878.       function. 
  879.  
  880.       The h_draws function simply displays a string at the current 
  881.       cursor location, using the font pointed to by the alphabet 
  882.       parameter.  No control codes or white space characters are 
  883.       intercepted. 
  884.  
  885.       The h_pattern function is used by the demo program to 
  886.       display some possible tile patterns.  Note the use of 
  887.       the OR put mode to create a crosshatch pattern by 
  888.       combining the left and right hatch patterns. 
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.       C News 1-09                Page 17                   15 Jul 1988
  900.  
  901.       ================================================================ 
  902.       PROGRAMMING FOR THE HERCULES GRAPHICS ADAPTER: PART II
  903.       ================================================================ 
  904.  
  905.       ABOUT THE AUTHOR 
  906.  
  907.                I am currently employed as an economist for the Virginia 
  908.       Department of Taxation.  I have a Bachelor's degree in Business 
  909.       Administration from Radford University and a Master's of Business
  910.       Administration from Virginia Polytechnic Institute.  My wife, son
  911.       and I are about to embark on a journey to Texas so I can begin work
  912.       on a Ph.D. in Management Information Systems at Texas A&M.  For this
  913.       reason, next months' article will be rather short.  I will continue 
  914.       to monitor the action in the C NEWS message area of the Virginia
  915.       C BBS and try my best to respond to your inquiries quickly.
  916.  
  917.                = DAVE = 
  918.  
  919.  
  920.  
  921.  
  922.       C News 1-09                Page 18                   15 Jul 1988
  923.  
  924.       ================================================================ 
  925.       PRACTICAL C: Everyday C Solutions
  926.       ================================================================ 
  927.  
  928.       RSE: A Program to redirect standard error.
  929.  
  930.          Scott Houck submitted this utility out our C BBS user meeting
  931.       this past week.  Scott needed a utility to redirect standard    
  932.       error, so that he could get compiler errors into a file. Polytron
  933.       Version Control System, had an RSE but Scott felt that he should
  934.       not be distributing it.  As it is a copyrighted product.  Thus
  935.       began the creation of his own RSE program, which is shown below:
  936.  
  937.       /* RSE.C -- a program to redirect standard error
  938.        *
  939.        * Written by Scott R. Houck
  940.        *
  941.        * This program will redirect standard error to standard output so
  942.        * that a program's standard error output can be sent to a file
  943.        * using the redirection symbols '>' or '>>' on the command line.
  944.        *
  945.        * The syntax is:  RSE program [arguments]
  946.        */
  947.  
  948.        #include <stdio.h>
  949.        #include <io.h>
  950.        #include <process.h>
  951.  
  952.        int main(argc, argv)
  953.        int argc;
  954.        char **argv;
  955.        {
  956.            if (argv < 2)
  957.                {
  958.                 fprintf(stderr, "Usage: RSE program [arguments]\n");
  959.                 exit(1);
  960.                 }
  961.           ++argv;
  962.           dup2(fileno(stdout), fileno(stderr));
  963.           return spawnvp(P_WAIT, *argv, argv);
  964.         }
  965.  
  966.  
  967.  
  968.       C News 1-09                Page 19                   15 Jul 1988  
  969.       ================================================================ 
  970.       Latest Versions of Commercial/PD Software. 
  971.       ================================================================ 
  972.  
  973.        Compilers:          Ver:            
  974.        ---------           ---- 
  975.  
  976.        Microsoft C         5.10 
  977.        QuickC              1.01 
  978.  
  979.        TurboC              1.5       /* With a rumored 2.0 out */ 
  980.        Datalight           2.1
  981.        MIX C               ? 
  982.        PowerC              ? 
  983.        Lattice C           ? 
  984.        Watcom              6.0 
  985.  
  986.       C News 1-09                Page 20                   15 Jul 1988  
  987.       ================================================================ 
  988.       ARTICLE SUBMISSION STANDARDS AND ADDRESSES 
  989.       ================================================================ 
  990.  
  991.    
  992.            As I have repeatedly stated in this newsletter and previous   
  993.       issues, I would like to see user-submitted articles, reviews or   
  994.       questions.  Listed below are the standards that should be   
  995.       followed to make my job easier as an editor.   
  996.    
  997.    
  998.           - Articles should be submitted in a ASCII non-formatted   
  999.             file.  (Margins 0-65 PLEASE) 
  1000.    
  1001.           - If the article include code fragments as examples. Then   
  1002.             you can include the entire source file if you like for    
  1003.             inclusion with the newsletter.   
  1004.    
  1005.           - Book or magazine reviews should follow the same format,   
  1006.             that is outlined in this issue.  The publisher, author,   
  1007.             title, and ISBN number are a must.     
  1008.    
  1009.           - Compiler/and or product reviews, should include the   
  1010.             version number and manufacture.  If possible, reviews   
  1011.             should include a sample program with benchmarks.   
  1012.    
  1013.        
  1014.             If you have any questions you can contact me at the   
  1015.       address's included on the next page.   
  1016.    
  1017.       C News 1-09                Page 21                   15 Jul 1988  
  1018.       ================================================================ 
  1019.       ADDRESSES 
  1020.       ================================================================ 
  1021.    
  1022.             The C BBS is located at:   
  1023.    
  1024.               C BBS   
  1025.               % BCL Limited   
  1026.               P.O. Box 9162   
  1027.               McLean VA, 22102   
  1028.    
  1029.    
  1030.             or you can send netmail to:   
  1031.    
  1032.    
  1033.             1:109/713    
  1034.    
  1035.    
  1036.    
  1037.    
  1038.   
  1039.       C News 1-09                Page 22                   15 Jul 1988  
  1040.       ================================================================ 
  1041.                             INDEX              
  1042.       ================================================================ 
  1043.    
  1044.       Subject:                                          Issue:   
  1045.    
  1046.       Articles:   
  1047.    
  1048.       Additional Comments of Filename Wild..             6  
  1049.       Beginning C Functions                              7  
  1050.       C Spot Run: A User Supported Library               7  
  1051.       Filename Wildcard Expansion in MSC                 4   
  1052.       Integrated Environment: TC & QC                    5   
  1053.       Programming the Hercules Graphics Card             8 
  1054.       Talking with a Fossil                              5   
  1055.       TurboC and Interrupts: A few Questions             2   
  1056.          
  1057.       Book Reviews:   
  1058.                
  1059.       C Chest: and other treasures.                      6  
  1060.       C Database Development                             1   
  1061.       C Programming Guide                                1   
  1062.       C Programming Language                             1   
  1063.       C Programmer's Guide to Serial Communications      3   
  1064.       C Programmer's Library                             1   
  1065.       C Primer Plus                                      1   
  1066.       C the Complete Reference                           2   
  1067.       Crafting C Tools for the IBM PC                    2   
  1068.       Learning to Program in C                           1   
  1069.       Microsoft C Programming on the IBM PC              1   
  1070.       MS-DOS Developer's Guide                           4   
  1071.       Programming in Windows                             3   
  1072.       Reliable Data Structures in C                      1   
  1073.       TurboC: Memory Resident Utilities                  5   
  1074.       TurboC Programmer's Reference Book                 2   
  1075.    
  1076.     
  1077.       Compilers:    
  1078.    
  1079.       QuickC                                             1  
  1080.         
  1081.       Software Reviews:    
  1082.      
  1083.       Bplus11.arc                                        3   
  1084.       C_Dates.arc                                        4   
  1085.       Cdate.arc                                          4   
  1086.       Casm.arc                                           3   
  1087.       C-subr.arc                                         4   
  1088.       Docu.arc                                           3   
  1089.       Ezwind.arc                                         8 
  1090.       Jcl-src.arc                                        4   
  1091.       Mscpopup.arc                                       3   
  1092.       Ndmake41.arc                                       4   
  1093.       C News 1-09                Page 23                   15 Jul 1988  
  1094.       ================================================================ 
  1095.                                   INDEX 
  1096.       ================================================================ 
  1097.  
  1098.    
  1099.       Subject:                                          Issue:   
  1100.    
  1101.       Software Reviews Cont:   
  1102.   
  1103.       Nuc-subr.arc                                       3  
  1104.       Prndoc.arc                                         6   
  1105.       Sed.arc                                            6   
  1106.       Shift_c.arc                                        4  
  1107.       Sysact11.arc                                       4   
  1108.       Tp_to_qc.arc                                       3   
  1109.       Xenixarc.arc                                       4   
  1110.    
  1111.       C News 1-09                 Page 24                  15 Jul 1988   
  1112.         
  1113.       ================================================================   
  1114.                             DISTRIBUTION POINTS   
  1115.       ================================================================   
  1116.    
  1117.    
  1118.       Board Name               Number         Net/Node       Sysop   
  1119.    
  1120.       United States   
  1121.    
  1122.       C BBS               (703) 644-6478      1:109/713      Barry Lynch   
  1123.       Burke, VA   
  1124.    
  1125.       Jaz C-Scape         (904) 724-1377      1:112/1027     Tom Evans   
  1126.       Jacksonville, FL   
  1127.  
  1128.    
  1129.       Eastern C Board     (201) 247-6748      1:107/335      Todd Lehr   
  1130.    
  1131.       OTHER BOARDS THAT CARRY C NEWS:
  1132.  
  1133.       Exec-PC             (414) 964-5160        ..           Bob Mahoney
  1134.       Milwaukee, WI
  1135.  
  1136.       Tamaini             (813) 793-2392                     Gerhard Barth
  1137.       Naples, FL
  1138.        
  1139.    
  1140.       Canada   
  1141.    
  1142.       Another BBS System  (416) 465-7752      1:148/208      Mark Bowman   
  1143.       Toronto, Canada   
  1144.    
  1145.       Europe   
  1146.    
  1147.       Fido_N1_1               31-8350-37156     2:500/1        Henk Wevers   
  1148.       The Netherlands   
  1149.    
  1150.       Australia   
  1151.    
  1152.       Alpha-Centuri BBS   011-61-3-874-3559    3:632/348     David Nugent   
  1153.    
  1154.    
  1155.       C News 1-09                Page 25                   15 Jul 1988  
  1156.       ================================================================ 
  1157.       USER RESPONSE FORM 
  1158.       ================================================================ 
  1159.    
  1160.        This form will be included as a regular feature in all future   
  1161.       issues of C NEWS.   
  1162.    
  1163.    
  1164.    
  1165.        What did you think of the content of this Issue?  _____________   
  1166.         
  1167.        _______________________________________________________________   
  1168.   
  1169.        What improvements can you think of that would make C News a   
  1170.        better tool for the C Community?   
  1171.    
  1172.        _______________________________________________________________   
  1173.  
  1174.        _______________________________________________________________   
  1175.    
  1176.    
  1177.        What is your favorite section or sections?  ___________________   
  1178.    
  1179.        _______________________________________________________________   
  1180.    
  1181.    
  1182.        What don't you like about C News?  ____________________________   
  1183.    
  1184.        _______________________________________________________________   
  1185.    
  1186.    
  1187.        Additional Comments:  _________________________________________   
  1188.    
  1189.        _______________________________________________________________   
  1190.    
  1191.        _______________________________________________________________   
  1192.    
  1193.        _______________________________________________________________   
  1194.  
  1195.    
  1196.   
  1197.   
  1198.   
  1199.